package com.qidian.buy.cart.service.impl;

import com.qidian.buy.cart.pojo.CartItem;
import com.qidian.buy.cart.service.CartService;
import com.qidian.buy.cart.vo.CartItemVO;
import com.qidian.buy.util.Tools;
import com.qidian.buy.util.pojo.QdResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * Author: 戴着假发的程序员
 * Date: 2024-05-17 10:54
 * company: 起点编程
 **/
@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private WebClient.Builder builder;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Value("${GOODS_SERVICE_NAME}") // 在配置文件中添加配置   buy-goods
    private String goodsServiceName;

    @Override
    public QdResult addItemToCart(CartItemVO vo, Long userId) {
        // 判断购物车中是否已经有商品，
        List<CartItem> cartList = getCartList(userId);
        // 如果有商品，修改商品数量即可
        boolean flag = false;
        for (CartItem item : cartList){
            if (item.getItemId().equals(vo.getItemId())){
                // 商品存在，修改数量
                item.setCount(item.getCount() + vo.getCount());
                flag = true;
                break;
            }
        }
        if(!flag){ // 说明购物车中没有商品信息
            // 远程请求加载商品信息
            QdResult result = builder.build().get().uri("http://" + goodsServiceName + "/item/get?itemId=" + vo.getItemId())
                    .retrieve().bodyToMono(QdResult.class).block();
            // 获取商品数据
            LinkedHashMap data = (LinkedHashMap) result.getData();
            // 准备一个购物车条目
            CartItem item = new CartItem();
            item.setItemId(vo.getItemId());
            item.setItemPrice(new Long(data.get("itemPrice").toString()));
            item.setItemTitle(data.get("itemTitle").toString());
            item.setCount(vo.getCount());
            item.setSpes(vo.getSpes());
            // 处理图片
            Object imagesObj = data.get("images");
            if(imagesObj != null){
                List<String> images = (List<String>) imagesObj;
                if(images.size() > 0){
                    item.setImage(images.get(0));
                }
            }
            // 添加到购物车中
            cartList.add(item);
        }
        // 将购物车再次写入redis中
        String key = "CART_" + userId;
        redisTemplate.opsForValue().set(key,Tools.object2json(cartList));
        return QdResult.success();
    }

    /**
     * 通过用户的id获取用户购物车列表，无论购物车是否存在都会返回一个列表
     * @param userId
     * @return
     */
    private List<CartItem> getCartList(Long userId){
        // 购物车的key key的前缀可以配置在配置文件中
        String key = "CART_" + userId;
        // 购物车的数据以JSON的格式存储
        if(!redisTemplate.hasKey(key)){
            return new ArrayList<CartItem>(); // 返回一个空的购物车
        }
        // 取出购物车
        String cartJson = redisTemplate.opsForValue().get(key);
        if(StringUtils.isBlank(cartJson)){
            return new ArrayList<CartItem>(); // 返回一个空的购物车
        }
        try{
            // 将JSON转换为购物车列列表
            return Tools.json2list(cartJson,CartItem.class);
        }catch (Exception e){
            // 删除信息
            redisTemplate.delete(key);
            // 返回空列表
            return new ArrayList<CartItem>(); // 返回一个空的购物车
        }
    }

    @Override
    public QdResult deleteItemFromCart(Long userId, Long itemId) {
        // 获取购物车
        List<CartItem> cartList = getCartList(userId);
        // 遍历购物车，查看商品是否存在，存在就删除，不存在就算了
        for (CartItem item : cartList){
            if (item.getItemId().equals(itemId)){
                // 商品存在，删除
                cartList.remove(item);
                break;
            }
        }
        // 将购物车再次写入redis中
        redisTemplate.opsForValue().set("CART_" + userId,Tools.object2json(cartList));
        return QdResult.success();
    }

    @Override
    public QdResult updateItemCount(Long userId, Long itemId, Integer count) {
        // 获取购物车
        List<CartItem> cartList = getCartList(userId);
        // 遍历购物车，查看商品是否存在，存在就修改数量，不存在就算了
        for (CartItem item : cartList){
            if (item.getItemId().equals(itemId)){
                // 商品存在，修改数量
                item.setCount(count);
                break;
            }
        }
        // 将购物车再次写入redis中
        redisTemplate.opsForValue().set("CART_" + userId,Tools.object2json(cartList));
        return QdResult.success();
    }

    @Override
    public QdResult list(Long userId) {
        return QdResult.success(getCartList(userId));
    }

    @Override
    public QdResult listByItemIds(Long[] itemIds,Long userId) {
        List<CartItem> cartList = getCartList(userId);
        // 准备一个新的List，将商品编号在itemIds中的数据放入新的list放回
        List<CartItem> newList = new ArrayList<CartItem>();
        for (CartItem item : cartList){
            for (Long itemId : itemIds){
                if (item.getItemId().equals(itemId)){
                    newList.add(item);
                    break;
                }
            }
        }
        return QdResult.success(newList);
    }
}
